Programación
A continuación se presentan y describen los componentes de software, tanto para Arduino, ROS y otros scripts. Arduino Listado de librerias y proyectos para arduinos. Cada uno debe estar descrito su funcionamiento, entradas y requerimientos de hardware. ROS Paquetes ROS A continuación se indican los paquetes implementados junto con su descripción * Nombre paquete: c_msg ** Description: A collection of custom messages, designed specifically for the transmition of data of the sensors from the Arduino, and other devices. This package does not contain any programs, but the definition of the message * Nombre paquete: joy2turtle ** Description: Consists on a set of programs designed to test communication with the Pioneer robot (if not available, can be changed to turtlesim), by remote-controlling it with different controllers. Currently, are supported Nokia-Arduino Joystick and PS3 SIXASIS Joystick ** Lista de programas: *** joy2turtle: ROS node that susbribes to topics published by the Nokia Joystick and proccess the commando to turn it into a valid RosAria/turtlesim order. To let ROS check the data from the serial port you must first run the specified script. *** sim_joystick: ROS node that simulates the orders provided by the Nokia Joystick (for tests pourposes only. Does not require an Arduino to be publishing messages) *** teleop_turtle_joy: ROS node that subscribes to the /joy topic (PS3 SIXAXIS). Sends the message to the /rosaria topic to control de Pioneer * Nombre paquete: smachine ** Description: Consists on a set of programs designed for the functioning of the platform's state machine. The platform is remote-controlled by a PS3 SIXAXIS Joystick. It contains the SMACH state machine and a set of servers and their corresponding action headers. Each server is related to a specific state. ** Servers list: *** alignment_server: ROS server related to the alignment state of the machine. It is subscribed to topics published by the PS3 SIXAXIS Joystick and the platform sensors, and it publishes to /rosaria to control de Pioneer. *** isnao_server: ROS server related to the isnao machine state. It is subscribed to topics published by the platform sensors. *** platform_server: ROS server related to platform_up and platform_down states. It is subscribed to topics published by the PS3 SIXAXIS Joystick and some platform sensors, and it publishes to the motor located in the platform. *** position_server: ROS server related to position, enter_table and leave_table states. It is subscribed to topics published by the PS3 SIXAXIS Joystick and some platform sensors, and it publishes to /rosaria to control de Pioneer. * Nombre paquete: simsensor ** Description: Consists on a set of programs designed for simulating the platform sensors. ** Lista de programas: *** callback_encoder: ROS node related to publishing by the simulated encoder. *** callback_ir: ROS node related to publishing by the simulated ir. *** callback_platform_sensors: ROS node related to publishing by the simulated platform sensors (limit switches and potenciometers). *** callback_sonar: ROS node related to publishing by the simulated sonar. Scripts Sobre el código para sensores: * Implementación para sensores de ultrasonido http://www.arduino.cc/en/Tutorial/Ping: ** void sonar_l(int trig, int echo){ // sonar(pin trig, pin echo) long previousMillis1 = 0; long previousMillis2 = 0; long interval10=10; // tiempo del pulso del trig unsigned long currentMillis2 = millis(); if(currentMillis2 - previousMillis2 > interval10) { // Se esperan 10 milisegundos previousMillis2 = currentMillis2; // Se actualiza el tiempo transcurrido digitalWrite(trig, LOW); // Se envia el pulso tiempo=pulseIn(echo, HIGH); // Se escucha el intervalo de tiempo que hay entre cada pulso distancia=(0.0172)*float(tiempo); // se convierte el tiempo en distancia, el factor 0.0172 corresponde al factor obtenido realizando una regresión lineal. } Sonar.publish(&sonar_msg); // Se publica en ROS la distancia Sonar.publish(&sonar_msg); } * Codigo para potenciometros: ** La implementacion del codigo es sencilla, solo hace falta leer el voltaje analógico del potenciometro, realizar el arreglo lineal, y publicar el mensaje en ros, de la siguiente manera: void potenciometer(int pin_pot){ // int pin_pot corresponde al pin donde se conecta val=analogRead(pin_pot)/46.54; // Arreglo lineal, con retorno de distancia en mm platform_msg.pot_left= digitalRead(pin_eol_l); // publicacion del mensaje Platform.publish(&platform_msg); * Codigo para fines de carrera: Es sensillo, se detecta cada vez que el fin de carrera es presionado y se publica ese estado: void endof (int pin_eol){ //int pin_eol corresponde al pin donde se conecte estado=digitalRead(pin_eol); if((estado HIGH)) { //El boton se presiona platform_msg.eol_left= digitalRead(pin_eol); Platform.publish(&platform_msg); } if (estado LOW) { //El boton no esta presionado platform_msg.eol_left= digitalRead(pin_eol); Platform.publish(&platform_msg); } estadoant=estado; } * Codigo para fin de carrera estado basal: El funcionamiento es identido al anterior, sin embargo se utiliza la modalidad attachtInterrupt() la cual llama a una función cada vez que detecta el estado definido (HIGH, por ejemplo). Cabe destacar, que el código para el encoder rotatorio es identico, agregando un contador de vueltas (k++) cada vez que detecta un cambio de estado (CHANGE). void endof_security(){ platform_msg.eol_left= digitalRead(eol_sec); Platform.publish(&platform_msg); } * Código para IR Sharp: * Finalmente, se presenta la distribucion de pines para conexiones en Arduino UNO R3: int pot_left=0; // Potenciometro izquierdo int pot_right=1; // Potenciometro derecho int eol_l=0; // Fin de carrera izquierdo int eol_r=1; // Fin de carrera derecho int eol_sec=2; // interrupcion fin de carrera estado basal int encoder=3; // interrupcion encoder ratatorio int trig_r=4; // trig sonar derecho int echo_r=5; // echo sonar derecho int trig_l=6; // trig sonar izquierdo int echo_l=7; // echo sonar derecho int trig_c=8; // trig sonar central posterior int echo_c=9; // echo sonar central posterir int ledPin1=10; // PWM para control de motor int ledPin2=11; // PWM para control de motor Others